// 柯里化就是将一个函数的功能细化，把接受「多个参数」的函数变换成接受一个「单一参数」的函数，并且返回接受「余下参数」返回结果的一种应用。
//
// 判断传递的参数是否达到执行函数的fn个数
// 没有达到的话，继续返回新的函数，将fn函数继续返回并将剩余参数累加
// 达到fn参数个数时，将累加后的参数传给fn执行
const currying = (fn, arr = []) => {
    let len = fn.length
    return function (...args) {
        arr = [...arr, ...args]
        if (arr.length < len) {
            return currying(fn, arr)
        } else {
            return fn(...arr)
        }
    }
}

// Test
function sum (a, b, c, d, e) {
    return a + b + c + d + e
}

let a = currying(sum, [1, 2])(3, 4)(5)
console.log(a) // 15

